package com.hhwy.framework.datasource;

import java.util.Iterator;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.jdbc.datasource.lookup.DataSourceLookup;

import com.hhwy.framework.cache.Cache;
import com.hhwy.framework.datasource.domain.DatasourceConfig;
/**
 * <b>类 名 称：</b>DynamicDataSource <br/>
 * <b>类 描 述：</b>动态数据源，用于指定默认数据源和目标数据源<br/>
 * <b>创 建 人：</b>lihuiming<br/>
 * <b>修 改 人：</b>Administrator<br/>
 * <b>修改时间：</b>2014年8月15日 上午8:34:52<br/>
 * <b>修改备注：</b><br/>
 * @version 1.0.0<br/>
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
	Map targetDataSources ;
	Map<String, DatasourceConfig> datasourceConfigMap ;
	Logger log = LoggerFactory.getLogger(DynamicDataSource.class);
	@Override
	protected Object determineCurrentLookupKey() {
		String dataSourceType= DataSourceContextHolder.getDataSourceType();
		return dataSourceType;
	}

	@Override
	public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
		super.setDefaultTargetDataSource(defaultTargetDataSource);
	}

	@SuppressWarnings("unchecked")
	@Override
	public void setTargetDataSources(@SuppressWarnings("rawtypes") Map targetDataSources) {
		this.targetDataSources = targetDataSources;
		super.setTargetDataSources(targetDataSources);
		setCache();
	}
	/**
	 * setCache 更新缓存中动态数据源的列表，用于集群同步<br/> 
	 * void
	 * @exception 
	 * @since  1.0.0
	*/
	private void setCache() {
		Iterator<String> it = datasourceConfigMap.keySet().iterator();
		while(it.hasNext()){
			String key = it.next();
			Cache.addDynamicDatasourceKey(datasourceConfigMap.get(key));
			log.info("setCache:::key:::"+key);
		}
	}

	public boolean containsDatasource(String key){
		
		return targetDataSources.containsKey(key);
	}
	/**
	 * 功能:动态添加数据源
	 * 作者: lihuiming
	 * 创建日期:2015年12月24日
	 * @param key 新增的数据源的标识
	 * @param dataSource 新增的数据源
	 */
	public void addDataSource(DatasourceConfig dsc,Object dataSource){
		String key = dsc.getAppName();
		this.targetDataSources.put(key, dataSource);
		super.setTargetDataSources(targetDataSources);
		super.afterPropertiesSet();
		if(!Cache.dynamicDatasourceContainsKey(key))
			Cache.addDynamicDatasourceKey(dsc);
		log.info("添加数据源:::"+key);
	}
	/**
	 * 功能:动态移除数据源
	 * 作者: lihuiming
	 * 创建日期:2015年12月24日
	 * @param key 移除的数据源的标识
	 */
	public void removeDatasource(Object key){
		this.targetDataSources.remove(key);
		super.setTargetDataSources(targetDataSources);
		super.afterPropertiesSet();
		if(!Cache.dynamicDatasourceContainsKey(key))
			Cache.removeDynamicDatasourceKey(key);
		log.info("移除数据源:::"+key);
	}

	/**
	 * setTargetDataSourceConfigs(描述这个方法的作用)<br/>
	 * @param datasourceConfigMap 
	 * void
	 * @exception 
	 * @since  1.0.0
	*/
	public void setTargetDataSourceConfigs(
			Map<String, DatasourceConfig> datasourceConfigMap) {
		this.datasourceConfigMap = datasourceConfigMap;
		
	}

}
